use <gears/gears.scad>

/*
打印参数（仅供参考，根据打印机、材料的情况进行设置）
材料：PETG
喷嘴：0.4mm，线宽：0.4mm
层高：0.15mm，顶层：7层，底层：7层 
外壳：3圈，外壳打印顺序：从外侧到内侧，提升尺寸精度
填充：80%，提升强度，防止高速运动时震动
风扇：30%，在不影响悬垂的前提下，尽可能慢，提升强度
热端温度：245℃，热床温度70℃
打印速度：80mm/s，加速度2000mm/s2，尽可能慢，提升精度
(平时打印对精度没有要求的模型，速度200mm/s)
齿轮单独打印，一个一个来，否则齿面上容易出现毛刺，
不好处理打印速度：20mm/s 其他一样

后处理：
爪子顶部组件上的8个自攻螺丝孔，孔径控制在2.0mm±0.1mm，
太大了容易滑丝，太小了容易在拧螺丝时开裂，如果打印后的
孔径误差较大，需要用2mm麻花钻钻一下。
除了齿轮和齿条有齿的表面，其他互相接触的面的毛刺，
都需要打磨掉，打磨后需要测试滑动是否顺畅。
组装之前涂抹润滑脂

*/

//$fs=1;
//show_gears = false;

$fa=2;
$fs=0.2;
show_gears = true;



hole_comp_5d = 0.25; // 用于补偿3D打印时孔径缩小的问题,5/4.5mm 型孔(TODO)
hole_comp_8 = 0.1;  // 用于补偿3D打印时孔径缩小的问题，8mm圆形孔
gear_width = 4.8;   // 齿轮的厚度
rack_width = 4.95;   // 齿条的厚度，设置为3D打印层高的整数倍
m3_nut_hole_d = 4.4;// 滚花螺母孔径，需要比滚花螺母直径略小一点
m3_hole_d = 3.4;    // m3通孔
m26x12_hole_d = 2.2;  // m2.6x12平头自攻螺丝孔
pi = 3.14159;

module round_cube(x,y,z,radius){
    translate([-x/2, -y/2, -z/2])
    hull(){
        translate([radius,radius,0])cylinder(h=z,r=radius);
        translate([-radius+x,radius,0])cylinder(h=z,r=radius);
        translate([radius,-radius+y,0])cylinder(h=z,r=radius);
        translate([-radius+x,-radius+y,0])cylinder(h=z,r=radius);
    }
}

module claw_top()
{   
    // 主体
    difference(){
        union(){
            translate([0, 0, 9/2]) 
                round_cube(102, 20+4*2, 9, radius=3);
            for(i=[-1:2:1]){
                for(j=[-1:2:1]){
                    translate([j*44, i*13, 9/2]) 
                        round_cube(8,4.7,9,2.3);
                    translate([j*24, i*13, 9/2])
                        round_cube(8,4.7,9,2.3);
                        //cylinder(h=9, d=4.6,center=true);
                }
            }
        }
        translate([0, 0, 9/2-4]) 
            cube([120, 20+0.2, 9], center=true);
        // 手指孔
        finger_offset = 33.6;
        translate([ finger_offset, 0, 0]) 
            cube([11+16.3, 12+0.3, 40], center=true);
        translate([-finger_offset, 0, 0]) 
            cube([11+16.3, 12+0.3, 40], center=true);
        // 减重孔
        translate([12.5, 0, 0]) round_cube(9, 12+0.3, 40, radius=1.5);
        translate([-12.5, 0, 0]) round_cube(9, 12+0.3, 40, radius=1.5);
        // 轴承孔
        cylinder(h=40, d=6.5, center=true);
        // 螺丝位
        for(i=[-1:2:1]){
            for(j=[-1:2:1]){
                translate([j*44, i*13, 0]) 
                    cylinder(h=40, d=m26x12_hole_d, center=true);
                translate([j*24, i*13, 0]) 
                    cylinder(h=40, d=m26x12_hole_d, center=true);
                
            }
        }
        
    }
}
module claw_bot()
{
    difference(){
        hole_offset = -7;
        union(){
            // 主体
            translate([0, 0, -4/2]) 
                round_cube(102, 20+4*2, 4, radius=3);
            for(i=[-1:2:1]){
                for(j=[-1:2:1]){
                    translate([j*44, i*13, -4/2]) 
                        round_cube(8,4.7,4,2.3);
                    translate([j*24, i*13, -4/2]) 
                        round_cube(8,4.7,4,2.3);
                }
            }
            translate([0, 0, -7-4]) cylinder(h=7, d1=18, d2=22);
            // 光电开关挡片
            for(i=[-1:2:1]){
                rotate([0,0,12]) translate([i*41, 0, -7]) 
                {
                    cube([2,6,6],center=true);
                    difference(){
                        translate([0, 0, (6-1.5)/2]) 
                            cube([5,6,1.5],center=true);
                        translate([-1.5-1, 0, (6-3)/2]) rotate([90,0,0]) 
                            cylinder(h=20,r=1.5,center=true);
                        translate([+1.5+1, 0, (6-3)/2]) rotate([90,0,0]) 
                            cylinder(h=20,r=1.5,center=true);
                    }
                }
            }
        }
        // 用于固定8mm空心轴的两个M3螺丝孔
        translate([0, 0, hole_offset]) rotate([90,0,0]) 
            cylinder(h=99, d=m3_nut_hole_d, center=true);
        translate([0, 20+8/2+5, hole_offset]) rotate([90,0,0]) 
            cylinder(h=40, d=6, center=true);
        translate([0, -20-8/2-5, hole_offset]) rotate([90,0,0]) 
            cylinder(h=40, d=6, center=true);
        // 8mm/5mm 台阶孔
        translate([0, 0, 0]) 
            cylinder(h=40, d=6, center=true);
        translate([0, 0, -4-20]) 
            cylinder(h=40, d=8 + hole_comp_8, center=true);
        // 螺丝位
        for(i=[-1:2:1]){
            for(j=[-1:2:1]){
                translate([j*44, i*13, 0]) 
                    cylinder(h=40, d=3, center=true);
                translate([j*24, i*13, 0]) 
                    cylinder(h=40, d=3, center=true);
                
            }
        }
        // 减重孔
        x1 = 45;
        x2 = 16;
        dy = 5;
        dx = 2*dy*tan(30);
        h = 4*2;
        translate([0, 0, -4-0.15*6]){
            for(i=[0:1:1]){
                rotate([0,0,180*i]){
                    hull(){
                        translate([x1, dy, 0]) cylinder(h=h, r=2, center=true);
                        translate([x1, -dy, 0]) cylinder(h=h, r=2, center=true);
                        translate([x1-dx, -dy, 0]) cylinder(h=h, r=2, center=true);
                    }
                    hull(){
                        translate([x2, dy, 0]) cylinder(h=h, r=2, center=true);
                        translate([x2, -dy, 0]) cylinder(h=h, r=2, center=true);
                        translate([x2+dx, -dy, 0]) cylinder(h=h, r=2, center=true);
                    }
                    hull(){
                        translate([(x2+x1)/2, -dy, 0]) cylinder(h=h, r=2, center=true);
                        translate([(x2+x1)/2+dx, dy, 0]) cylinder(h=h, r=2, center=true);
                        translate([(x2+x1)/2-dx, dy, 0]) cylinder(h=h, r=2, center=true);
                    }
                }
            }
        }
    }
}
module d_cylinder(d=5, cut=4.5)
{
    difference(){
        cylinder(h=40, d=d, center=true);
        translate([0, -5-(cut-d/2), 0])
            cube([10,10,41], center=true);
    }
}

module gear10()
{
    if(show_gears){
        difference(){
            spur_gear (modul=1.5, tooth_number=8, width=gear_width, bore=0, 
                      pressure_angle=20, helix_angle=20, optimized=false);
            d_cylinder(5+hole_comp_5d, 4.5+hole_comp_5d);
        }
    }
}


module finger(offset = 0, show_2mm_pad=true)
{
    dist_from_center = 94 / 2 - offset;
    finger_len = 35;
    finger_len2 = 23;
    translate([dist_from_center, 0 ,0])
    difference(){
        union(){
            // 齿条
            if(show_gears){
                translate([ - 37.5, -6 ,0])
                    rack(modul=1.5, length=25.7, height=4, width=rack_width, pressure_angle=20, helix_angle=-20);
                translate([-26.2, -6-4 ,0])
                    cube([20,4,rack_width]);
                translate([-15+0.5, -6-0.5 ,0])
                    cube([4,4,rack_width]);
            }
            // 滑块
            translate([-3.5, 0, rack_width/2])
                cube([15, 20, rack_width], center=true);
            // 手指
            translate([-3/2, 0, finger_len/2]){
                rotate([90,0,90]) round_cube(12,finger_len,3,1.5);
            }
            difference(){
                translate([-11/2, 0, finger_len2/2])
                    cube([11, 12, finger_len2], center=true);
                translate([-10/2, 0, finger_len2+5.18]) rotate([0,75,0])
                    cube([10, 20, 20], center=true);
            }
        }
        // 圆角，防止应力集中断掉
        translate([-3-1.6/2, 0, finger_len2]){
            rotate([90,0,0]) cylinder(40,d=1.6,center=true);
        }
        // 切除齿条多余部分
        translate([-58, -8*1.5/2-5 ,-4])
            rotate([0,-20,0]) cube([10,7,7]);
        translate([-15+0.5, -6+3.5 ,0])
            cylinder(h=40,r=3.5, center=true);
        // 减重孔
        hull(){
            translate([-9, 0, 16]) rotate([0,75,0])
                cylinder(h=20, d=5, center=true, $fn=4);
            translate([-9.9, 0, 4.5]) rotate([0,90,0])
                cylinder(h=20, d=5, center=true);
        }
    }
    // 硅胶垫
    if(show_2mm_pad){
        translate([dist_from_center, 0 ,0])
        translate([-3-1, 0, 17+12])
            rotate([90,0,90]) color("white") round_cube(12,12,2,1.5);
    }
}


// offset 0 - 16mm 
// 14 for 56mm cube
// 2.3 for flip
module robot_arm(offset = 14)
{
    translate([0,0,0.1]) rotate([0,0, 24 - offset / (8*1.5*pi) * 360]) 
        gear10();
    translate([0,0,0.05/2]) 
        finger(offset);
    translate([0,0,0.05/2]) rotate([0,0,180]) 
        finger(offset);
    claw_bot();
    claw_top(); 
}


robot_arm(14);
